package socratesteam.model.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import socratesteam.model.common.Fecha;
import socratesteam.model.dominio.Publicacion;
import socratesteam.model.dominio.Usuario;
import socratesteam.model.excepcion.DAOExcepcion;
import socratesteam.model.util.ConexionBD;

public class PublicacionDAO extends BaseDAO {

	private static final long serialVersionUID = 7783861353281156797L;

	public Publicacion insertar(Publicacion oPublicacion) throws DAOExcepcion {
		String query = "INSERT INTO tab_publicacion"
				+ "(N_CODIGO_CATEGORIA,"
				+ "C_TITULO,"
				+ "C_DESCRIPCION,"
				+ "N_FLAGNUEVO,"
				+ "N_CANTIDAD,"
				+ "N_PRECIO,"
				+ "N_DURACION,"
				+
				// "B_FOTO1," +
				// "B_FOTO2," +
				// "B_FOTO3," +
				"N_ESTADO," + "N_CANTIDAD_VENDIDA," + "D_FECHA_CREACION,"
				+ "D_FECHA_CIERRE," + "N_CODIGO_USUARIO)"
				+ "VALUES(?,?,?,?,?,?,?,?,?,?,?,?)";

		Connection oConnection = null;
		PreparedStatement oStatement = null;
		ResultSet oSet = null;

		try {
			oConnection = ConexionBD.obtenerConexion();
			oStatement = oConnection.prepareStatement(query);
			oStatement.setInt(1, oPublicacion.getCategoria().getCodigo());
			oStatement.setString(2, oPublicacion.getTitulo());
			oStatement.setString(3, oPublicacion.getDescripcion());
			oStatement.setInt(4, oPublicacion.getFlagnuevo());
			oStatement.setInt(5, oPublicacion.getCantidad());
			oStatement.setDouble(6, oPublicacion.getPrecio());
			oStatement.setInt(7, oPublicacion.getDuracion());
			// oStatement.setBlob(8, oPublicacion.getFoto1());
			// oStatement.setBlob(9, oPublicacion.getFoto2());
			// oStatement.setBlob(10, oPublicacion.getFoto3());
			oStatement.setInt(8, oPublicacion.getEstado().getCodigo());
			oStatement.setInt(9, oPublicacion.getCantidadVendida());
			oStatement.setDate(10,
					Fecha.utilToSql(oPublicacion.getFechaCreacion()));
			oStatement.setDate(11,
					Fecha.utilToSql(oPublicacion.getFechaCierre()));
			oStatement.setInt(12, oPublicacion.getUsuario().getCodigo());

			int i = oStatement.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}

			if (i == 1) {
				System.out.println("Se inserto correctamente");
			}

			query = "SELECT LAST_INSERT_ID()";
			oStatement = oConnection.prepareStatement(query);
			oSet = oStatement.executeQuery();
			if (oSet.next()) {
				oPublicacion.setCodigo(oSet.getInt(1));
			}

		} catch (SQLException e) {
			e.printStackTrace();
			throw new DAOExcepcion(e.getMessage());
		}
		return oPublicacion;
	}

	public boolean buscarTitulo(Publicacion oPublicacion) throws DAOExcepcion {
		String query = "select count(*) from tab_publicacion where c_titulo=?";

		Connection oConnection = null;
		PreparedStatement oStatement = null;
		ResultSet oSet = null;
		int res = 0;

		try {
			oConnection = ConexionBD.obtenerConexion();
			oStatement = oConnection.prepareStatement(query);
			oStatement.setString(1, oPublicacion.getTitulo());
			oSet = oStatement.executeQuery();
			if (oSet.next()) {
				res = oSet.getInt(1);
			}

			if (res > 0) {
				return true;
			}

		} catch (SQLException e) {
			e.printStackTrace();
			throw new DAOExcepcion(e.getMessage());
		}
		return false;
	}

	// Listado
	public Collection<Publicacion> listar() throws DAOExcepcion {
		Collection<Publicacion> c = new ArrayList<Publicacion>();

		Connection oConnection = null;
		PreparedStatement oStatement = null;
		ResultSet oSet = null;

		try {

			oConnection = ConexionBD.obtenerConexion();
			String query = "select n_codigo_categoria,c_titulo,c_descripcion,n_flagnuevo,n_cantidad,n_precio,n_duracion,n_estado,n_cantidad_vendida,d_fecha_creacion,d_fecha_cierre from tab_publicacion order by titulo";
			oStatement = oConnection.prepareStatement(query);
			oSet = oStatement.executeQuery();
			while (oSet.next()) {
				Publicacion oPublicacion = new Publicacion();
				oPublicacion.setCodigo(oSet.getInt("n_codigo_categoria"));
				oPublicacion.setTitulo(oSet.getString("c_titulo"));
				oPublicacion.setDescripcion(oSet.getString("c_descripcion"));
				oPublicacion.setFlagnuevo(oSet.getInt("n_flagnuevo"));
				oPublicacion.setCantidad(oSet.getInt("n_cantidad"));
				oPublicacion.setPrecio(oSet.getDouble("n_precio"));
				// oPublicacion.SetEstado(oSet.getString("n_estado"))
				oPublicacion.setCantidadVendida(oSet
						.getInt("n_cantidad_vendida"));
				oPublicacion.setFechaCreacion(oSet.getDate("n_fecha_creacion"));
				oPublicacion.setFechaCierre(oSet.getDate("n_fecha_cierre"));
				c.add(oPublicacion);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(oSet);
			this.cerrarStatement(oStatement);
			this.cerrarConexion(oConnection);
		}
		return c;
	}

	public List<Publicacion> mostrarpublicacion(Publicacion oPublicacion)
			throws DAOExcepcion {
		String query = "select c_titulo, c_descripcion, n_cantidad,tu.n_codigo,tpe.c_nombres,"
				+ "c_apellido_paterno,c_apellido_materno from tab_publicacion tp "
				+ "inner join tab_usuario tu on tp.n_codigo_usuario=tu.n_codigo "
				+ "inner join tab_persona tpe on tu.c_dni=tpe.c_dni where tu.n_codigo=?";

		Connection oConnection = null;
		PreparedStatement oStatement = null;
		ResultSet oSet = null;
		Publicacion o;
		List<Publicacion> lista = new ArrayList<Publicacion>();

		try {
			oConnection = ConexionBD.obtenerConexion();
			oStatement = oConnection.prepareStatement(query);
			oStatement.setInt(1, oPublicacion.getUsuario().getCodigo());
			oSet = oStatement.executeQuery();

			if (oSet.next()) {
				o = new Publicacion();
				o.setTitulo(oSet.getString(1));
				o.setDescripcion(oSet.getString(2));
				o.setCantidad(oSet.getInt(3));
				o.setUsuario(new Usuario(oSet.getInt(4)));
				o.getUsuario().setNombres(oSet.getString(5));
				o.getUsuario().setApellidoPaterno(oSet.getString(6));
				o.getUsuario().setApellidoMaterno(oSet.getString(7));
				lista.add(o);
			}

		} catch (SQLException e) {
			e.printStackTrace();
			throw new DAOExcepcion(e.getMessage());
		}
		return lista;
	}

}
